/**
 *  Document   : SubscriptionTreatment
 *  Created on : 17 juil. 2008, 09:59:33
 *  Author     : Rivo
 */
package gla.centralhotel.uiweb.treatment;

import com.sun.rave.web.ui.appbase.AbstractRequestBean;
import gla.centralhotel.business.ISubscriptionManagement;
import gla.centralhotel.exception.AgencySubscriptionException;
import gla.centralhotel.exception.IllegalAuthenticationException;
import gla.centralhotel.exception.ManagerSubscriptionException;
import gla.centralhotel.exception.SubscriptionManagementException;
import gla.centralhotel.model.Agency;
import gla.centralhotel.model.Country;
import gla.centralhotel.model.Manager;
import gla.centralhotel.model.Zipcode;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.FacesException;
import gla.centralhotel.uiweb.ApplicationBean;
import gla.centralhotel.uiweb.SubscriptionForm;
import gla.centralhotel.uiweb.SessionBean;
import gla.centralhotel.uiweb.screens.HotelManagerAccount;
import javax.faces.context.FacesContext;

/**
 * <p>Request scope data bean for your application.  Create properties
 *  here to represent data that should be made available across different
 *  pages in the same HTTP request, so that the page bean classes do not
 *  have to be directly linked to each other.</p>
 *
 * <p>An instance of this class will be created for you automatically,
 * the first time your application evaluates a value binding expression
 * or method binding expression that references a managed bean using
 * this class.</p>
 *
 */
public class SubscriptionTreatment extends AbstractRequestBean {

    @EJB
    private ISubscriptionManagement subscription;
    FacesContext context = getFacesContext();
    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }
    // </editor-fold>

    /**
     * <p>Construct a new request data bean instance.</p>
     */
    public SubscriptionTreatment() {
    }

    /**
     * <p>This method is called when this bean is initially added to
     * request scope.  Typically, this occurs as a result of evaluating
     * a value binding or method binding expression, which utilizes the
     * managed bean facility to instantiate this bean and store it into
     * request scope.</p>
     * 
     * <p>You may customize this method to allocate resources that are required
     * for the lifetime of the current request.</p>
     */
    @Override
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here

        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("SubscriptionTreatment Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }

    // </editor-fold>
    // Perform application initialization that must complete
    // *after* managed components are initialized
    // TODO - add your own initialization code here
    }

    /**
     * <p>This method is called when this bean is removed from
     * request scope.  This occurs automatically when the corresponding
     * HTTP response has been completed and sent to the client.</p>
     * 
     * <p>You may customize this method to clean up resources allocated
     * during the execution of the <code>init()</code> method, or
     * at any later time during the lifetime of the request.</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean getApplicationBean() {
        return (ApplicationBean) getBean("ApplicationBean");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SessionBean getSessionBean() {
        return (SessionBean) getBean("SessionBean");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected HotelManagerAccount getHotelManagerAccount() {
        return (HotelManagerAccount) getBean("HotelManagerAccount");
    }

    /**
     * Uniquement utiliser pour l'inscription!!
     * @param form
     * @throws gla.centralhotel.exception.SubscriptionManagementException
     * @throws gla.centralhotel.exception.IllegalAuthenticationException
     */
    public void subscribeUser(SubscriptionForm form) throws SubscriptionManagementException, IllegalAuthenticationException {
        Integer idUserLogged = Integer.valueOf((String)form.getUserLogged().getSelected());
        if (idUserLogged.equals(new Integer(1))) {
            Manager mgr = new Manager();
            mgr.setCivility(form.getDdlCivilite().getSelected().toString());
            mgr.setName(form.getTbNom().getValueAsString(context));
            mgr.setFirstname(form.getTbPrenom().getValueAsString(context));
            mgr.setCompanyName(form.getTbSociete().getValueAsString(context));
            mgr.setAddress1(form.getTbAdresse1().getValueAsString(context));
            mgr.setAddress2(form.getTbAdresse2().getValueAsString(context));
            mgr.setAddress3(form.getTbAdresse3().getValueAsString(context));
            mgr.setEmail(form.getTbEmail().getValueAsString(context));
            mgr.setPassword((String) form.getTbMdp1().getPassword());
            Zipcode tmp = new Zipcode(Integer.valueOf((String) form.getDdlCodePostal().getSelected()));
            mgr.setRefZipcode(tmp);
            
            String ctrId = (String) form.getDdlPays().getSelected();
            Country ctr = new Country(Integer.valueOf(ctrId));
            mgr.setRefCountry(ctr);

            try {
                /* Stocke le nouveau manager dans une variable session => currentManager*/
                mgr = subscription.saveManagerSubscription(mgr);
//            getSessionBean().setCurrentManager(mgr);
            } catch (IllegalAuthenticationException ex) {
                Logger.getLogger(SubscriptionTreatment.class.getName()).log(Level.SEVERE, null, ex);
                throw new IllegalAuthenticationException("Login et mot de passe incorrects");
            } catch (SubscriptionManagementException ex) {
                Logger.getLogger(SubscriptionTreatment.class.getName()).log(Level.SEVERE, "E-mail déjà utilisé", ex);
                throw new SubscriptionManagementException("E-mail déjà présent en base");
            }
        } else if (idUserLogged.equals(new Integer(0))) {
            Agency ag = new Agency();
            ag.setName(form.getTbNom().getValueAsString(context));
            ag.setLogin(form.getTbEmail().getValueAsString(context));
            ag.setPassword((String) form.getTbMdp1().getPassword());
            try {
                subscription.saveAgencySubscription(ag);
            } catch (IllegalAuthenticationException ex) {
                Logger.getLogger(SubscriptionTreatment.class.getName()).log(Level.SEVERE, null, ex);
                throw new IllegalAuthenticationException("Login et mot de passe incorrects");
            } catch (AgencySubscriptionException ex) {
                Logger.getLogger(SubscriptionTreatment.class.getName()).log(Level.SEVERE, "E-mail déjà utilisé", ex);
                throw new SubscriptionManagementException("E-mail déjà présent en base");
            }
        }
    }

    /**
     * Màj des infos du manager
     * @param form
     * @throws gla.centralhotel.exception.ManagerSubscriptionException
     * @throws gla.centralhotel.exception.IllegalAuthenticationException
     */
    public void updateAManagerInfo(HotelManagerAccount form) throws ManagerSubscriptionException, IllegalAuthenticationException {
        Manager mgr = getSessionBean().getCurrentManager();
        mgr.setCivility(form.getDdlCivilite().getSelected().toString());
        mgr.setName(form.getTbNom().getValueAsString(context));
        mgr.setFirstname(form.getTbPrenom().getValueAsString(context));
        mgr.setCompanyName(form.getTbSociete().getValueAsString(context));
        mgr.setAddress1(form.getTbAdresse1().getValueAsString(context));
        mgr.setAddress2(form.getTbAdresse2().getValueAsString(context));
        mgr.setAddress3(form.getTbAdresse3().getValueAsString(context));
//        mgr.setEmail(form.getTbEmail().getValueAsString(context));
        mgr.setPassword((String) form.getTbMdp1().getPassword());
        Zipcode tmp = new Zipcode(Integer.valueOf((String) form.getDdlCodePostal().getSelected()));
        mgr.setRefZipcode(tmp);
        Country ctr = new Country((Integer) form.getDdlPays().getSelected());
        mgr.setRefCountry(ctr);
        try {
            /* Stocke le nouveau manager dans une variable session => currentManager*/
            mgr = subscription.updateManagerInfo(mgr);
            getSessionBean().setCurrentManager(mgr);
        } catch (ManagerSubscriptionException ex) {
            Logger.getLogger(SubscriptionTreatment.class.getName()).log(Level.SEVERE, null, ex);
            throw new ManagerSubscriptionException("Mise à jour impossible les " +
                    "infos suivantes sont incorrectes : id et/ou email et/ou mote de passe");
        } catch (IllegalAuthenticationException ex) {
            Logger.getLogger(SubscriptionTreatment.class.getName()).log(Level.SEVERE, null, ex);
            throw new IllegalAuthenticationException("Login et mot de passe incorrects");
        }
    }
}
